package com.apexcode.common.core.constants;

/**
 * 缓存常量类，定义缓存键前缀、有效期、刷新时间等，用于统一管理系统中缓存相关的常量。
 * 缓存键设计基于 Redis，支持竞赛、题目、用户、认证、消息和验证码等模块。
 */
public class CacheConstants {

    //-------------------------------------------------------------------------
    // 通用缓存设置
    //-------------------------------------------------------------------------
    /**
     * 默认缓存有效期，单位分钟（720分钟 = 12小时），适用于大多数缓存场景。
     */
    public static final long EXPIRATION = 720;

    /**
     * 默认缓存刷新间隔，单位分钟（120分钟 = 2小时），用于定期更新缓存。
     */
    public static final long REFRESH_TIME = 120;

    /**
     * 用户相关缓存的过期时间，单位分钟（10分钟），适用于用户信息等高频更新场景。
     */
    public static final long USER_EXP = 10;

    /**
     * 列表操作的默认起始索引（基于0），用于分页或范围查询。
     */
    public static final long DEFAULT_START = 0;

    /**
     * 列表操作的默认结束索引（-1表示最后一个元素），用于分页或范围查询。
     */
    public static final long DEFAULT_END = -1;

    //-------------------------------------------------------------------------
    // 认证缓存 (前缀: login_tokens: 或 logintoken:)
    //-------------------------------------------------------------------------
    /**
     * 登录令牌缓存键前缀，用于存储用户认证令牌（如 JWT），格式如 "login_tokens:user_id"。
     */
    public static final String LOGIN_TOKEN_KEY = "login_tokens:";

    //-------------------------------------------------------------------------
    // 竞赛相关缓存 (前缀: e:)
    //-------------------------------------------------------------------------
    /**
     * 竞赛详情缓存键，用于存储特定竞赛的元数据，格式如 "e:d:exam_id"。
     */
    public static final String EXAM_DETAIL = "e:d:";

    /**
     * 未开始竞赛列表的缓存键，存储未开始的竞赛 ID 列表。
     */
    public static final String EXAM_NOT_STARTED_LIST = "e:t:l";

    /**
     * 未完成竞赛列表的缓存键，存储用户未完成的竞赛 ID 列表（与 EXAM_NOT_STARTED_LIST 含义可能重叠，视需求调整）。
     */
    public static final String EXAM_UNFINISHED_LIST = "e:t:l";

    /**
     * 历史（已完成）竞赛列表的缓存键，存储已结束的竞赛 ID 列表。
     */
    public static final String EXAM_HISTORY_LIST = "e:h:l";

    /**
     * 用户关联的竞赛列表前缀，存储特定用户参与的竞赛，格式如 "e:u:l:user_id"。
     */
    public static final String EXAM_USER_LIST = "e:u:l:";

    /**
     * 特定竞赛下题目列表的前缀，存储竞赛中的题目 ID 列表，格式如 "e:q:l:exam_id"。
     */
    public static final String EXAM_QUESTION_LIST = "e:q:l:";

    /**
     * 特定竞赛中用户排名列表的前缀，存储竞赛排名数据，格式如 "e:r:l:exam_id"。
     */
    public static final String EXAM_RANK_LIST = "e:r:l:";

    //-------------------------------------------------------------------------
    // 题目相关缓存 (前缀: q:)
    //-------------------------------------------------------------------------
    /**
     * 题目详情缓存键，用于存储特定题目的元数据，格式如 "q:d:question_id"。
     */
    public static final String QUESTION_DETAIL = "q:d";

    /**
     * 通用题目列表的缓存键，存储所有题目 ID 的列表。
     */
    public static final String QUESTION_LIST = "q:l";

    /**
     * 按创建时间排序的题目列表缓存键，存储按时间排序的题目 ID 列表。
     */
    public static final String QUESTION_TIME_LIST = "q:t:l";

    /**
     * 按难度级别映射的题目列表前缀，存储按难度分类的题目，格式如 "q:d:l:level"。
     */
    public static final String QUESTION_DIFF_LIST = "q:d:l:";

    /**
     * 热门或趋势题目列表的缓存键，存储热门题目 ID 列表。
     */
    public static final String QUESTION_HOT_LIST = "q:h:l";

    public static final String QUESTION_HOST_LIST = "q:h:l";

    //-------------------------------------------------------------------------
    // 用户相关缓存 (前缀: u:)
    //-------------------------------------------------------------------------
    /**
     * 用户详情缓存键，用于存储用户个人资料信息，格式如 "u:d:user_id"。
     */
    public static final String USER_DETAIL = "u:d:";

    /**
     * 特定用户关联的竞赛列表前缀，存储用户参与的竞赛，格式如 "u:e:l:user_id"。
     */
    public static final String USER_EXAM_LIST = "u:e:l:";

    /**
     * 特定用户关联的消息列表前缀，存储用户接收的消息，格式如 "u:m:l:user_id"。
     */
    public static final String USER_MESSAGE_LIST = "u:m:l:";

    /**
     * 用户文件上传次数的缓存键，存储用户上传文件的计数，格式如 "u:u:t:user_id"。
     */
    public static final String USER_UPLOAD_TIMES_KEY = "u:u:t";

    /**
     * 用户消息读取状态的缓存键，存储用户消息的已读/未读状态，格式如 "u:m:r:t:user_id"。
     */
    public static final String USER_MESSAGE_READ_STATUS = "u:m:r:t";

    //-------------------------------------------------------------------------
    // 消息相关缓存 (前缀: m:)
    //-------------------------------------------------------------------------
    /**
     * 消息详情缓存键，用于存储特定消息的内容，格式如 "m:d:message_id"。
     */
    public static final String MESSAGE_DETAIL = "m:d:";

    //-------------------------------------------------------------------------
    // 手机验证码相关缓存 (前缀: p:, t:, c:)
    //-------------------------------------------------------------------------
    /**
     * 手机验证码缓存前缀，用于存储验证码，格式如 "p:c:phone_number"。
     */
    public static final String PHONE_CODE_KEY = "p:c:";

    /**
     * 验证码生成时间戳的前缀，存储验证码生成时间，格式如 "c:t:phone_number"。
     */
    public static final String CODE_TIME_KEY = "c:t:";

    /**
     * 短信验证码发送次数的前缀，存储某号码的发送计数，格式如 "t:l:phone_number"。
     */
    public static final String PHONE_CODE_TIMES_KEY = "t:l:";

    /**
     * 需要发送短信验证码的电话号码集合的缓存键，存储待发送号码列表。
     */
    public static final String PHONE_CODE_USER_SET_KEY = "t:p:a";
}